/**
 * 使用 try_recv() 接收消息，并打印出来。

*/
use std::sync::mpsc;
use std::thread;
use std::time::Duration;
#[derive(Debug)]
#[allow(dead_code)]
struct Message {
    sender: String, // 发送者标识
    content: String, // 消息内容
    order: u8, // 消息序号

}

fn main() {
    // --snip--
    let (tx, rx) = mpsc::channel();   //channel() 返回一个元组，分别表示发送和接收者
    let tx1 = tx.clone();
    thread::spawn(move || {           // 移动tx1所有权到新线程中。为什么需要move？规定就是这样
        let vals = vec![
            Message{sender: String::from("x1"),content: String::from("风"),order:1},
            Message{sender: String::from("x1"),content: String::from("紧"),order:2},
            Message{sender: String::from("x1"),content: String::from("扯"),order:3},
            Message{sender: String::from("x1"),content: String::from("呼"),order:4}
        ];
        for val in vals {
            tx1.send(val).unwrap();
            println!("tx1 is sending....");
            thread::sleep(Duration::from_millis(200));
        }
    });

    thread::spawn(move || {
        let vals = vec![
            Message{sender: String::from("x0"),content: String::from("乘"),order:1},
            Message{sender: String::from("x0"),content: String::from("胜"),order:2},
            Message{sender: String::from("x0"),content: String::from("追"),order:3},
            Message{sender: String::from("x0"),content: String::from("击"),order:4}
        ];

        for val in vals {
            tx.send(val).unwrap();
            println!("tx0 is sending....");
            thread::sleep(Duration::from_millis(100));
        }
    });

    //把收到的消息分别放入到两个Vec中，以便于观察顺序。
    let mut v0 = Vec::new();
    let mut v1 = Vec::new();
    let mut qty=0;
    //利用rx的迭代器接收消息. 无需显示调用rec(),或者try_recv()，迭代器会自动调用。

    //利用try_recv()接收消息，并打印出来。
    loop {
        match rx.try_recv() {
            Ok(val) => {
                if val.sender == "x0" {
                    v0.push(val);
                }
                else{
                    v1.push(val);
                }
                qty+=1;
            }
            Err(_) => {
                if qty==8 {
                    break;
                }
                thread::sleep(Duration::from_millis(200));
            }
        }
        println!("...快点啊！");
    }

    let msg0 = get_msg(v0);
    let msg1 = get_msg(v1);

    println!("从t0收到的消息是: {}", msg0);
    println!("从t1收到的消息是: {}", msg1);

    if msg0!=msg1 {
        println!("那一份消息是真的？应该信任谁？还是说都是真的？\n 如果都是真的，为什么会这样？");
    }

}

fn get_msg(msg:Vec<Message>) -> String   {
    let mut result = String::new();
    for m in msg {
        result.push_str(&m.content);
    }
    return result;
}